package com.vviton.zyhj.admin.content;

import java.lang.reflect.InvocationTargetException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.web.client.RestTemplate;

import redis.clients.jedis.Jedis;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.vviton.zyhj.common.base.AppConfig;
import com.vviton.zyhj.common.common.GlobalConstants;
import com.vviton.zyhj.common.common.HCacheConstants;
import com.vviton.zyhj.common.content.SpringContext;
import com.vviton.zyhj.common.view.ViewHzfInfo;
import com.wdcloud.hcache.redis.connection.DataSourceManager;
import com.wdcloud.hcache.redis.connection.IRedisTemplate;
import com.wdcloud.hcache.redis.connection.RedisCallback;
import com.wdcloud.login.client.session.SimpleSessionUserHolder;

/**
 * ClassName: CommonConstants <br/>
 * Function: 公共接口模板定义字段. <br/>
 * Date: 2015年9月12日 <br/>
 *
 * @author wanrj
 * @version 1.0
 * @since JDK 1.7
 */
public abstract class CommonConstants {

    /** 日志 */
    private static Logger logger = Logger.getLogger(CommonConstants.class);

    /** 所在地区--中国 **/
    public static final String SZDQ_ZG = "000000";

    /** 删除 */
    public static final String DELFLAG_DELETE = "D";

    /** 账户类型 00 平台 **/
    public static final String ZHLX_PT = "00";

    /** 适用范围(交易中心) **/
    public static final String SYFW_JYZX = "01";

    /** 密码强度校验：1-校验 **/
    public static final String PASSWORDSTRENGTHCHECK_YES = "1";

    /** 密码强度校验：0-不校验 **/
    public static final String PASSWORDSTRENGTHCHECK_NO = "0";

    /** 操作方式：0-创建 **/
    public static final String OPERATETYPE_ADD = "0";

    /** 操作方式：1-更新 **/
    public static final String OPERATETYPE_UPDATE = "1";

    /** 企业主账号 **/
    public static final String ZH_QYZZH = "zh-qyzzh";

    /** 企业管理员账号 **/
    public static final String ZH_QYGLY = "zh-qygly";

    /** 默认密码 **/
    public static final String DEFAULT_PASSWORD = "111111";

    /** 管理员名称 **/
    public static final String GLYMC = "管理员";

    /** 资源汇聚系统APPKEY **/
    public static final String ZYHJ_APPKEY = "09";

    /** 合作方已入驻且已签署协议 **/
    public static final String HZF_XYYES_RZYES = "0";

    /** 合作方已入驻且未签署协议 **/
    public static final String HZF_XYNO_RZYES = "1";

    /** 合作方未入驻且未签署协议 **/
    public static final String HZF_XYNO_RZNO = "2";

    /**
     * 根据请求获取运维人员会话信息
     *
     * @param req HttpServletRequest
     * @return 运维人员会话信息
     */
    public static SessionYwry getSessionYwry(HttpServletRequest req) {
        final String zh = getYwryzh(req);
        SessionYwry sessionYWRY = null;
        if (StringUtils.isNotBlank(zh) && StringUtils.isNotEmpty(zh)) {
            IRedisTemplate redisTemplate = DataSourceManager.newInstance().getRedisTemplate(HCacheConstants.CH_REDIS_DS_NAME);
            // 获取当前的sessionId
            Cookie[] cookies = req.getCookies();
            String sessonId = "";
            for (Cookie cookie : cookies) {
                if (GlobalConstants.SESSION_KEY.equals(cookie.getName())) {
                    sessonId = cookie.getValue();
                }
            }
            final String userSessionId = sessonId;
            // 判断redis中是否存在用户信息
            Object userInfo = redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String redisKey = HCacheConstants.YW_REDIS_NAME + ":" + GlobalConstants.SESSION_KTXX + ":" + userSessionId + "_" + zh;
                    return jedis.get(redisKey);
                }
            });
            if (userInfo != null) {
                logger.info("redis中存在会员信息");
                JSONObject userInfoJson = JSONObject.parseObject(userInfo.toString());
                sessionYWRY = JSONObject.toJavaObject(userInfoJson, SessionYwry.class);
                return sessionYWRY;
            } else {
                logger.info("redis中不存在会员信息,开始获取会员信息并存入");
                sessionYWRY = new SessionYwry();
                sessionYWRY.setZh(zh);
                setHyncAndUserid(req, sessionYWRY);
                // 保存登录信息到Redis中
                final Object sessionYwxxJson = JSONObject.toJSON(sessionYWRY);
                redisTemplate.execute(false, new RedisCallback<Object>() {
                    @Override
                    public Object execute(Jedis jedis) {
                        AppConfig appConfig = SpringContext.getBean(AppConfig.class);
                        String redisKey = HCacheConstants.YW_REDIS_NAME + ":" + GlobalConstants.SESSION_YWRY + ":" + userSessionId + "_" + zh;
                        // 设置过期时间为30分钟
                        jedis.setex(redisKey, appConfig.getSessionExpired(), sessionYwxxJson.toString());
                        return null;
                    }
                });
            }
        }

        return sessionYWRY;
    }

    /**
     * @Desc 实体Bean 浅copy
     * @Author weiming.chen
     * @Date 2016年1月19日 下午4:19:48
     * @param dest 目标对象
     * @param orig 源对象
     * @return 是否拷贝成功
     */
    public static boolean copyProperties(Object dest, Object orig) {
        try {
            ConvertUtils.register(new DateLocaleConverter(), java.util.Date.class);
            BeanUtils.copyProperties(dest, orig);
            return true;
        } catch (IllegalAccessException | InvocationTargetException e) {
            return false;
        }
    }

    /**
     *
     * getYwryzh,获取运维人员账号. <br/>
     * Author: weiming.chen <br/>
     * Create Date: 2016年4月27日 <br/>
     * ===============================================================<br/>
     * Modifier: weiming.chen <br/>
     * Modify Date: 2016年4月27日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param req 请求对象
     * @return 运维人员账号
     * @since JDK 1.7
     */
    public static String getYwryzh(HttpServletRequest req) {
        SimpleSessionUserHolder userHolder = SpringContext.getBean(SimpleSessionUserHolder.class);
        String zh = userHolder.getLoginId(req);
        return zh;
    }

    /**
     *
     * setHyncAndUserid,设置会员昵称和用户id. <br/>
     * Author: weiming.chen <br/>
     * Create Date: 2016年4月27日 <br/>
     * ===============================================================<br/>
     * Modifier: weiming.chen <br/>
     * Modify Date: 2016年4月27日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param req 请求对象
     * @param SessionYwry
     * @return SessionYWRY
     * @since JDK 1.7
     */
    public static SessionYwry setHyncAndUserid(HttpServletRequest req, SessionYwry ywry) {
        SimpleSessionUserHolder userHolder = SpringContext.getBean(SimpleSessionUserHolder.class);
        ywry.setUserid(userHolder.getUserId(req));
        ywry.setHync(userHolder.getNickName(req));
        return ywry;
    }

    /**
     *
     * getHzfInfo,(跨第三方查询合作方是否入驻信息). <br/>
     * Author: libo <br/>
     * Create Date: 2017年3月25日 <br/>
     * ===============================================================<br/>
     * Modifier: libo <br/>
     * Modify Date: 2017年3月25日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param hzfid
     * @return
     * @since JDK 1.7
     */
    public static ViewHzfInfo getHzfInfo(String hzfid) {
        RestTemplate restTemplate = new RestTemplate();
        AppConfig appConfig = SpringContext.getBean(AppConfig.class);
        String url = appConfig.getUrlGetHzfInfo() + "?hzfid=" + hzfid;
        String hzfxxStr = restTemplate.getForObject(url, String.class);
        ViewHzfInfo result = null;
        if (StringUtils.isNotBlank(hzfxxStr)) {
            result = JSONObject.toJavaObject(JSON.parseObject(hzfxxStr), ViewHzfInfo.class);
        }
        return result;
    }

}
